#include "shmem.h"

static struct shm_param para;
union val_t
{ 
    int b_val;  //bool类型存储空间
    int i_val;   //整形值存储空间
    float f_val;  //浮点值存储空间
};
struct std_node
{
	int key;  //唯一键值
	int type;  //数据点类型
    int dev_type;  //数据点属于哪个设备，根据网关支持的设备自行定义
	union val_t old_val;  //变化上报后需要更新旧值
    union val_t new_val;  //从共享内存取出最新数据，放到new_val中
    int ret;  //默认为-1，采集成功后设置为0，采集失败再置-1
};
static int *total;  //指向共享内存中数据节点总个数
static struct std_node *node_arr;  //指向共享内存中节点缓存数组头

#define MAX_NODE 16  //最大支持结构点数目
#define STD_NODE_LEN sizeof(struct std_node)
#define MAX_NODE_SIZE (MAX_NODE * STD_NODE_LEN)

int main(int argc, char *argv[])
{
    int ret = -1;

    ret = shm_init(&para, "shm_test", MAX_NODE_SIZE);
    if(ret < 0)
    {
        return -1;
    }


    void *node_p = shm_getaddr(&para);
    if(node_p == NULL)
    {
        return -1;
    }

    //前4个字节存储实际的学生数目
    total = (int *)node_p;
    //后面空间存储数据点
    node_arr = (struct std_node *)(node_p + sizeof(int));

    printf("num = %d\n", *total);
    while (1)
    { 
    int i;
    for(i=0; i<*total; i++)
    {
        if (i==1)
        {
        printf("key=%d,type=%d,dev_type=%d,new_val=%.2f,ret=%d",\
        node_arr[i].key,node_arr[i].type,node_arr[i].dev_type,node_arr[i].new_val.f_val,node_arr[i].ret);
        printf("\n");
        }
        else if (i==2)
        {
        printf("key=%d,type=%d,dev_type=%d,new_val=%.2f,ret=%d",\
        node_arr[i].key,node_arr[i].type,node_arr[i].dev_type,node_arr[i].new_val.f_val,node_arr[i].ret);
        printf("\n");
        }
        else
        {
        printf("key=%d,type=%d,dev_type=%d,new_val=%d,ret=%d",\
        node_arr[i].key,node_arr[i].type,node_arr[i].dev_type,node_arr[i].new_val.i_val,node_arr[i].ret);
        printf("\n");
        }
    }
    sleep(5);
    }

    //这个接口只有在这块共享内存不用了才能删除，项目中如果一直使用，不要调用这个接口
    //shm_del(&para);

    return 0;
}
